package java.atributo;

import java.Anotar;
import java.classe.ClasseEntidade;
import java.classe.TokensSource;
import java.instancia.Instancia;
import java.util.ArrayList;

public class Atributo implements TokensSource {
	ClasseEntidade classe = null;

	boolean finalizarBloco = false;

	String nome = null;

	Instancia valueDefault = null;

	String tipo = null;

	String modificador = null;

	boolean statico = false;

	String instaciaValorDefault = null;

	private ListaAnotacao anotacoes;

	public Atributo(String tipo, String nome) {
		this.nome = nome;
		this.tipo = tipo;
	}

	public Atributo(ClasseEntidade tipo, String nome) {
		this(tipo.getNome(), nome);
		this.classe = tipo;
	}

	public Atributo(String tipo, String nome, boolean finalizarComando) {
		this(tipo, nome);
		this.finalizarBloco = finalizarComando;
	}

	public String codigoFonte() {
		String modificador = this.modificador == null ? NONVALUE
				: this.modificador + ESPACO;
		String instancia = instaciaValorDefault == null ? NONVALUE : IGUAL
				+ instaciaValorDefault;
		String statico = this.statico ? STATIC + ESPACO : NONVALUE;
		String valueDefault = this.valueDefault == null ? NONVALUE : ESPACO
				+ IGUAL + ESPACO + this.valueDefault.codigoFonte();
		String anotacao = this.anotacoes == null ? "" : this.anotacoes
				.codigoFonte();
		String finalizarBloco = this.finalizarBloco ? FIMCOMANDO : NONVALUE;
		return anotacao + modificador + statico + tipo + ESPACO + nome
				+ valueDefault + instancia + finalizarBloco;
	}

	public String getNome() {
		return this.nome;
	}

	public String getEndereco() {
		return THIS + PONTO + this.nome;
	}

	public void setStatico(boolean statico) {
		this.statico = statico;
	}

	public ClasseEntidade getClasse() throws Exception {
		if (classe == null)
			throw new Exception("NON TYPE OBJECT");
		return this.classe;
	}

	public void putValueDefault(Instancia valueDefault) {
		this.valueDefault = valueDefault;
	}

	public void setModificador(String modificador) {
		this.modificador = modificador;

	}

	public void addAnotacao(Anotar anotacao) {
		if (this.anotacoes == null)
			this.anotacoes = new ListaAnotacao();
		this.anotacoes.add(anotacao);
	}

	class ListaAnotacao extends ArrayList<Anotar> {
		private static final long serialVersionUID = -7193627651129649829L;

		public String codigoFonte() {
			String s = "";
			for (Anotar anotacao : this) {
				s += anotacao.codigoFonte();
			}
			return s;
		}
	}

	public void finalizarBloco(boolean finalizarBloco) {
		this.finalizarBloco = finalizarBloco;
	}

	public boolean isFimComando() {
		return this.finalizarBloco;
	}

	public String getTipo() {
		return this.tipo;
	}

}
